package com.lzhsite.technology.designPattern.singleton.enums;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class SerEnumSingleton implements Serializable {
	
    private volatile static SerEnumSingleton uniqueInstance;
    private  String content;
    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
    private SerEnumSingleton() {
    }

    public static SerEnumSingleton getInstance() {
        if (uniqueInstance == null) {
            synchronized (SerEnumSingleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new SerEnumSingleton();
                }
            }
        }
        return uniqueInstance;
    }

//  输出结果：
//   序列化前读取其中的内容：单例序列化
//	com.lxp.pattern.singleton.SerSingleton@135fbaa4
//	com.lxp.pattern.singleton.SerSingleton@58372a00
//	序列化后读取其中的内容：单例序列化
//	序列化前后两个是否同一个：false
//	
//	 分析：
//   可以看出，序列化前后两个对象并不相等。为什么会出现这种问题呢?这
//   "任何一个readObject方法，不管是显式的还是默认的，它都会返回一个新建的实例，
//   这个新建的实例不同于该类初始化时创建的实例。

 
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        SerEnumSingleton s = SerEnumSingleton.getInstance();
        s.setContent("单例序列化");
        System.out.println("序列化前读取其中的内容："+s.getContent());
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("SerSingleton.obj"));
        oos.writeObject(s);
        oos.flush();
        oos.close();

        FileInputStream fis = new FileInputStream("SerSingleton.obj");
        ObjectInputStream ois = new ObjectInputStream(fis);
        SerEnumSingleton s1 = (SerEnumSingleton)ois.readObject();
        ois.close();
        System.out.println(s+"\n"+s1);
        System.out.println("序列化后读取其中的内容："+s1.getContent());
        System.out.println("序列化前后两个是否同一个："+(s==s1));
    }
    
}
